package com.hucsmn.authentication;

import java.io.Serializable;

/**
 * 用户认证信息类。
 */
public class UserMessage implements Serializable {
    private static final long serialVersionUID = -7883901458916721007L;

    /**
     * 消息类型：检查用户登录信息。
     */
    public static final String CHECK = "check";

    /**
     * 消息类型：用户登录信息正确。
     */
    public static final String SUCCESS = "success";

    /**
     * 消息类型：用户登录信息错误。
     */
    public static final String FAIL = "fail";

    private String type;
    private User user;

    /**
     * 创建用户认证信息，消息类型为 CHECK。
     *
     * @param user 用户登录信息。
     */
    UserMessage(User user) {
        this(CHECK, user);
    }

    /**
     * 创建用户认证信息，提供消息类型。
     *
     * @param type 消息类型。
     * @param user 用户登录信息。
     */
    UserMessage(String type, User user) {
        setType(type);
        setUser(user);
    }

    /**
     * 验证反序列化结果的正确性。
     *
     * @return 对象内部状态正确时，返回真。
     */
    public boolean validate() {
        switch (type) {
            case CHECK:
            case SUCCESS:
            case FAIL:
                break;
            default:
                return false;
        }
        return user != null &&
                user.getUsername() != null && !user.getUsername().isEmpty() &&
                user.getPassword() != null && !user.getPassword().isEmpty();
    }

    /**
     * 获取消息类型。
     *
     * @return 消息类型。
     */
    public String getType() {
        return type;
    }

    /**
     * 设置消息类型。
     *
     * @param type 消息类型。
     */
    public void setType(String type) {
        if (type == null) {
            throw new NullPointerException();
        }
        switch (type) {
            case CHECK:
            case SUCCESS:
            case FAIL:
                break;
            default:
                throw new IllegalArgumentException();
        }
        this.type = type;
    }

    /**
     * 获取用户登录信息。
     *
     * @return 用户登录信息。
     */
    public User getUser() {
        return user;
    }

    /**
     * 设置用户登录信息。
     *
     * @param user 用户登录信息。
     */
    public void setUser(User user) {
        if (user == null) {
            throw new NullPointerException();
        }
        this.user = user;
    }
}
